package th.retrofit.lib;

/**
 *
 * https://leetcode-cn.com/problems/valid-number/
 *
 * 有效数字（按顺序）可以分成以下几个部分：
 *
 * 一个 小数 或者 整数
 * （可选）一个 'e' 或 'E' ，后面跟着一个 整数
 * 小数（按顺序）可以分成以下几个部分：
 *
 * （可选）一个符号字符（'+' 或 '-'）
 * 下述格式之一：
 * 至少一位数字，后面跟着一个点 '.'
 * 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字
 * 一个点 '.' ，后面跟着至少一位数字
 * 整数（按顺序）可以分成以下几个部分：
 *
 * （可选）一个符号字符（'+' 或 '-'）
 * 至少一位数字
 * 部分有效数字列举如下：
 *
 * ["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
 * 部分无效数字列举如下：
 *
 * ["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
 * 给你一个字符串 s ，如果 s 是一个 有效数字 ，请返回 true 。
 */
public class Solution65 {

    public boolean isNumber(String s) {
        boolean eOccur = false;
        boolean pointOccur = false;
        int sLen = s.length();
        int i = 0;
        while (i < sLen) {
            char c = s.charAt(i);
            if (c == '.') {
                if (pointOccur) return false;
                boolean pre = false;
                boolean after = false;
                if(i > 0 ) {
                    pre = isNum(s.charAt(i - 1));
                }
                if (i + 1 < sLen) {
                    char temp = s.charAt(i + 1);
                    after = isNum(temp);
                }
                if (!(pre || after)) return false;
                i++;
                pointOccur = true;
                continue;
            } else if ((c == '+' || c == '-')) {
                if (i != 0) {
                    return false;
                } else {
                    i++;
                    continue;
                }
            } else if (c == 'e' || c == 'E') {
                boolean pre = false;
                boolean after = false;
                if(i > 0 ) {
                    pre = isNum(s.charAt(i - 1)) || s.charAt(i - 1) == '.';
                }
                if (!pre) {
                    return false;
                }
                while (++i < sLen) {
                    char temp = s.charAt(i);
                    if (s.charAt(i - 1) == 'e' && (temp == '+' || temp == '-')) {
                        continue;
                    }
                    if (isNum(temp)) {
                        after = true;
                    } else {
                        after = false;
                        break;
                    }
                }
                if (!after) return false;
                i++;
                continue;
            } else if (!isNum(c)) {
                return false;
            }
            i++;
        }
        return true;
    }

    private boolean isNum(char c) {
        return c >= '0' && c <= '9';
    }

    public static void main(String[] args) {
        System.out.println(new Solution65().isNumber("0.."));
    }

}
